import os
import random
import cv2

# 全局变量
# cap 用于存储视频捕获对象
cap = None
# video_files 用于存储视频文件路径列表
video_files = []
# current_video_path 用于存储当前正在播放的视频文件路径
current_video_path = ""

# 鼠标回调函数，处理鼠标点击事件
def mouse_callback(event, x, y, flags, param):
    global cap, video_files, current_video_path
    # 鼠标左键点击事件
    if event == cv2.EVENT_LBUTTONDOWN:
        # 检查视频捕获对象是否存在且已成功打开
        if cap and cap.isOpened():
            # 获取视频的帧率
            fps = cap.get(cv2.CAP_PROP_FPS)
            # 计算需要快进的帧数（30 秒对应的帧数）
            frame_skip = int(30 * fps)
            # 获取当前视频的播放帧位置
            current_frame = cap.get(cv2.CAP_PROP_POS_FRAMES)
            # 计算快进后的帧位置
            new_frame = current_frame + frame_skip
            # 检查快进后的帧位置是否在视频总帧数范围内
            if new_frame < cap.get(cv2.CAP_PROP_FRAME_COUNT):
                # 设置视频的播放帧位置
                cap.set(cv2.CAP_PROP_POS_FRAMES, new_frame)
                # 计算并输出跳转后的时间点
                new_time = new_frame / fps
                print(f"已快进到 {new_time:.2f} 秒")
            else:
                print("已到达视频末尾")
    # 鼠标右键点击事件
    elif event == cv2.EVENT_RBUTTONDOWN:
        # 检查视频捕获对象是否存在
        if cap:
            # 释放视频捕获对象占用的资源
            cap.release()
        # 检查视频文件列表是否为空
        if video_files:
            # 随机选择一个视频文件路径
            current_video_path = random.choice(video_files)
            print(f"现在播放的视频: {os.path.basename(current_video_path)}")
            # 从视频文件列表中移除当前选择的视频文件路径
            video_files.remove(current_video_path)
            # 调用播放视频函数播放新视频
            play_video()

# 播放视频函数
def play_video():
    global cap, current_video_path
    # 打开视频文件，创建视频捕获对象
    cap = cv2.VideoCapture(current_video_path)
    # 检查视频文件是否成功打开
    if not cap.isOpened():
        # 检查视频文件列表是否为空
        if video_files:
            # 随机选择一个新的视频文件路径
            current_video_path = random.choice(video_files)
            # 从视频文件列表中移除当前选择的视频文件路径
            video_files.remove(current_video_path)
            # 递归调用播放视频函数播放新视频
            play_video()
        return

    # 创建一个名为 'Video Player' 的窗口
    cv2.namedWindow('Video Player')
    # 为 'Video Player' 窗口设置鼠标回调函数
    cv2.setMouseCallback('Video Player', mouse_callback)
    # 用于标记是否按下空格键退出程序的标志
    global_quit = False

    # 循环读取视频帧
    while True:
        # 读取一帧视频
        ret, frame = cap.read()
        # 检查是否成功读取到视频帧
        if not ret:
            break

        # 在 'Video Player' 窗口中显示当前视频帧
        cv2.imshow('Video Player', frame)

        # 等待 25 毫秒，检查是否有按键事件
        key = cv2.waitKey(25)
        # 检查是否按下空格键
        if key == 32:
            # 设置退出标志为 True
            global_quit = True
            break

    # 释放视频捕获对象占用的资源
    cap.release()
    # 关闭所有由 OpenCV 创建的窗口
    cv2.destroyAllWindows()

    # 检查是否按下空格键退出程序
    if global_quit:
        return

    # 检查视频文件列表是否为空
    if video_files:
        # 随机选择一个新的视频文件路径
        current_video_path = random.choice(video_files)
        print(f"现在播放的视频: {os.path.basename(current_video_path)}")
        # 从视频文件列表中移除当前选择的视频文件路径
        video_files.remove(current_video_path)
        # 递归调用播放视频函数播放新视频
        play_video()

# 获取当前脚本所在的目录路径
script_dir = os.path.dirname(os.path.abspath(__file__))
# 拼接 video 文件夹的路径
video_folder = os.path.join(script_dir, "video")

# 检查 video 文件夹是否存在
if not os.path.exists(video_folder):
    print("video 文件夹不存在，请检查。")
else:
    # 初始化视频文件列表
    video_files = []
    # 遍历 video 文件夹下的所有文件
    for f in os.listdir(video_folder):
        # 检查文件扩展名是否为视频文件格式
        if f.lower().endswith(('.mp4', '.avi', '.mov')):
            # 将视频文件路径添加到视频文件列表中
            video_files.append(os.path.join(video_folder, f))
            # 最多读取 50 个视频文件
            if len(video_files) >= 50:
                break

    # 检查视频文件列表是否为空
    if not video_files:
        print("video 文件夹下没有视频文件，请检查。")
    else:
        # 随机选择一个视频文件路径
        current_video_path = random.choice(video_files)
        print(f"现在播放的视频: {os.path.basename(current_video_path)}")
        # 从视频文件列表中移除当前选择的视频文件路径
        video_files.remove(current_video_path)
        # 调用播放视频函数开始播放视频
        play_video()